﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Data;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace elr_tracking_bal.ART
{
    public class Articulo : INotifyPropertyChanged
    {
        private int _ID_ARTICULO;
        private string _ARTICULO;
        private Categoria _CATEGORIA;
        private Equipo _EQUIPO;
        private Marca _MARCA;
        private Modelo _MODELO;
        private string _IDENTIFICADOR;

        public float CANTIDAD { get; set; }
        public float COSTOU { get; set; }
        public Moneda MONEDA { get; set; }
        public float IVA { get; set; }

        public int ID_ARTICULO
        {
            get
            {
                return _ID_ARTICULO;
            }
            set
            {
                if (_ID_ARTICULO != value)
                {
                    _ID_ARTICULO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("ID_ARTICULO"));
                    }
                }

            }
        }

        public string ARTICULO
        {
            get
            {
                return _ARTICULO;
            }
            set
            {
                if (_ARTICULO != value)
                {
                    _ARTICULO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("ID_ARTICULO"));
                    }
                }

            }
        }

        public string IDENTIFICADOR
        {
            get
            {
                return _IDENTIFICADOR;
            }
            set
            {
                if (_IDENTIFICADOR != value)
                {
                    _IDENTIFICADOR = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("ID_ARTICULO"));
                    }
                }

            }
        }

        public Categoria CATEGORIA
        {
            get
            {
                return _CATEGORIA;
            }
            set
            {
                if (_CATEGORIA != value)
                {
                    _CATEGORIA = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("CATEGORIA"));
                    }
                }

            }
        }

        public Equipo EQUIPO
        {
            get
            {
                return _EQUIPO;
            }
            set
            {
                if (_EQUIPO != value)
                {
                    _EQUIPO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("EQUIPO"));
                    }
                }

            }
        }

        public Marca MARCA
        {
            get
            {
                return _MARCA;
            }
            set
            {
                if (_MARCA != value)
                {
                    _MARCA = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("MARCA"));
                    }
                }

            }
        }

        public Modelo MODELO
        {
            get
            {
                return _MODELO;
            }
            set
            {
                if (_MODELO != value)
                {
                    _MODELO = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("MODELO"));
                    }
                }

            }
        }
        /// <summary>
        /// Método que ejecuta el store para recuperar los Artículos
        /// </summary>
        /// <returns></returns>
        public static DataTable GetData(int ID_Proveedor)
        {
            DataTable dt;
            dt = elr_tracking_dal.SrvDB.ExecuteQuery("exec SP_GETLIST_ART_ARTICULO @IDP = " + ID_Proveedor);
            return dt;
        }

        
        /// <summary>
        /// Método para recuperar la lista de Artículos
        /// </summary>
        /// <returns></returns>
        public static ObservableCollection<VisibleArticulo> GetDataArticulo(int ID_Proveedor)
        {
            try
            {
                DataTable dt;
                dt = Articulo.GetData(ID_Proveedor);
                ObservableCollection<VisibleArticulo> list = new ObservableCollection<VisibleArticulo>();
                if (dt.Rows.Count == 0)
                {
                    return list;
                }
                else
                {
                    for (int x = 0; x < dt.Rows.Count; x++)
                    {
                        int id_Art = Convert.ToInt32(dt.Rows[x][0]);
                        string nombre = dt.Rows[x][1].ToString();
                        int id_Cat = Convert.ToInt32(dt.Rows[x][2]);
                        int id_equipo = Convert.ToInt32(dt.Rows[x][3]);
                        int id_marca = Convert.ToInt32(dt.Rows[x][4]);
                        int id_modelo = Convert.ToInt32(dt.Rows[x][5]);
                        string equipo = dt.Rows[x][6].ToString();
                        string categoria = dt.Rows[x][7].ToString();
                        string marca = dt.Rows[x][8].ToString();
                        string modelo = dt.Rows[x][9].ToString();
                        string identificador = dt.Rows[x][10].ToString();

                        Categoria cat = new Categoria(id_Cat, categoria);
                        Equipo eq = new Equipo(id_equipo, equipo);
                        Marca mr = new Marca(id_marca, marca);
                        Modelo md = new Modelo(id_modelo, modelo);

                        VisibleArticulo art = new VisibleArticulo(id_Art, nombre, cat, eq, mr, md, identificador, 0);
                        list.Add(art);

                    }
                    /*List<Articulo> list = dt.AsEnumerable().Select(
                        row => new Articulo
                        {
                            ID_ARTICULO = row.Field<int?>("ID_ARTICULO").GetValueOrDefault(),
                            _ARTICULO = String.IsNullOrEmpty(row.Field<string>("ARTICULO")) ? "" : row.Field<string>("ARTICULO"),
                            //_CATEGORIA = String.IsNullOrEmpty(row.Field<string>("CATEGORIA")) ? "" : row.Field<string>("CATEGORIA"),
                            //_EQUIPO = String.IsNullOrEmpty(row.Field<string>("EQUIPO")) ? "" : row.Field<string>("EQUIPO"),
                            //_MARCA = String.IsNullOrEmpty(row.Field<string>("MARCA")) ? "" : row.Field<string>("MARCA"),
                            //_MODELO = String.IsNullOrEmpty(row.Field<string>("MODELO")) ? "" : row.Field<string>("MODELO"),
                            _IDENTIFICADOR = String.IsNullOrEmpty(row.Field<string>("IDENTIFICADOR")) ? "" : row.Field<string>("IDENTIFICADOR"),

                        }
                        ).ToList();*/
                    return list;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Método para insertar un Artículo
        /// </summary>
        /// <param name="art"></param>
        /// <returns></returns>
        //public static elr_tracking_bal.UpsertStateMsg InsertArticulo(Articulo art)
        //{
        //    Articulo inser;
        //    UpsertStateMsg inserart;
        //    try
        //    {
        //        int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_INSERT_ART_ARTICULO '" + art.ARTICULO +"','" + art.ID_CATEGORIA + "','"
        //                                   + art.ID_EQUIPO + "','" + art.ID_MARCA + "','" + art.ID_MODELO + "','" + art.IDENTIFICADOR+"'");
        //        inser = new Articulo(art.ARTICULO);
        //        inserart = new UpsertStateMsg("Registros guardados " + dt.ToString(), true);
        //        return inserart;
        //    }
        //    catch (Exception ex)
        //    {
        //        inserart = new UpsertStateMsg("Error al guardar " + ex, false);
        //        return inserart;
        //    }
        //}
        /// <summary>
        /// Método para eliminar varios Artículos 
        /// </summary>
        /// <param name="ID_ARTICULO"></param>
        /// <returns></returns>
        public static elr_tracking_bal.DeleteStateMsg DeleteArticulo(string[] ID_ARTICULO)
        {
            elr_tracking_bal.DeleteStateMsg delete;
            string join;
            if (ID_ARTICULO == null)
            {
                join = "";
            }
            else
            {
                join = String.Join(",", ID_ARTICULO);
            }
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_DELETE_ART_ARTICULO '" + join + "'");
                delete = new elr_tracking_bal.DeleteStateMsg("Registro eliminado" + dt.ToString(), true);
                return delete;
            }
            catch (Exception ex)
            {
                delete = new elr_tracking_bal.DeleteStateMsg("Error al eliminar" + ex, false);
                return delete;
            }
        }
        /// <summary>
        /// Método para modificar un Artículo
        /// </summary>
        /// <param name="art"></param>
        /// <returns></returns>
        //public static elr_tracking_bal.UpsertStateMsg UpdateArticulo(Articulo art)
        //{
        //    Articulo update;
        //    UpsertStateMsg updateCat;
        //    try
        //    {
        //        int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_UPDATE_ART_ARTICULO " + art.ID_ARTICULO + ",'" + art.ARTICULO + "'," + art.ID_CATEGORIA + "," + art.ID_EQUIPO + "," + art.ID_MARCA + "," + art.ID_MODELO + ",'" + art.IDENTIFICADOR + "'");

        //        update = new Articulo(art.ID_ARTICULO, art.ARTICULO, new Categoria(art.ID_CATEGORIA, ""), art.ID_EQUIPO, art.ID_MARCA, art.ID_MODELO, art.IDENTIFICADOR);
        //        updateCat = new UpsertStateMsg("Registros actualizados " + dt.ToString(), true);
        //        return updateCat;
        //    }
        //    catch (Exception ex)
        //    {
        //        updateCat = new UpsertStateMsg("Error al actualizar " + ex, false);
        //        return updateCat;
        //    }
        //}
        /// <summary>
        /// Método para obtener un Artículo
        /// </summary>
        /// <param name="ID_ARTICULO"></param>
        /// <returns></returns>
        public static Articulo GetOneArticulo(int ID_ARTICULO )
        {
            try
            {
                Articulo art;
                DataTable dt = elr_tracking_dal.SrvDB.ExecuteQuery("exec SP_GETONE_ART_ARTICULO " + ID_ARTICULO + "");
                if (dt.Rows.Count == 0)
                {
                    return null;
                }
                else if (ID_ARTICULO == 0)
                {
                    return null;
                }
                else
                {
                    art = new Articulo(Convert.ToInt32(dt.Rows[0]["ID_ARTICULO"])
                        ,Convert.ToString(dt.Rows[0]["ARTICULO"])
                        ,new Categoria( Convert.ToInt32(dt.Rows[0]["ID_CATEGORIA"]), Convert.ToString(dt.Rows[0]["CATEGORIA"]) )
                        ,new Equipo (Convert.ToInt32(dt.Rows[0]["ID_EQUIPO"]), Convert.ToString(dt.Rows[0]["EQUIPO"]))
                        ,new Marca (Convert.ToInt32(dt.Rows[0]["ID_MARCA"]), Convert.ToString(dt.Rows[0]["MARCA"]))
                        ,new Modelo(Convert.ToInt32(dt.Rows[0]["ID_MODELO"]), Convert.ToString(dt.Rows[0]["MODELO"]))
                        ,Convert.ToString(dt.Rows[0]["IDENTIFICADOR"]));
                }
                return art;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Constructor de sin parámetros
        /// </summary>
        public Articulo() { }
        /// <summary>
        /// Constructor con parámetros
        /// </summary>
        /// <param name="ID_ARTICULO"></param>
        /// <param name="ARTICULO"></param>
        /// <param name="categoria"></param>
        /// <param name="equipo"></param>
        /// <param name="marca"></param>
        /// <param name="modelo"></param>
        /// <param name="IDENTIFICADOR"></param>
        public Articulo(int ID_ARTICULO, string ARTICULO, Categoria categoria, Equipo equipo, Marca marca, Modelo modelo ,string IDENTIFICADOR)
        {
            this._ID_ARTICULO = ID_ARTICULO;
            this._ARTICULO = ARTICULO;
            this._CATEGORIA = new Categoria(categoria.ID_CATEGORIA, categoria.CATEGORIA);
            this._EQUIPO = new Equipo(equipo.ID_EQUIPO, equipo.EQUIPO);
            this._MARCA = new Marca(marca.ID_MARCA, marca.MARCA);
            this._MODELO = new Modelo(modelo.ID_MODELO, modelo.MODELO);
            this._IDENTIFICADOR = IDENTIFICADOR;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

